Token 認證是透過發送請求時附帶 Token 來識別使用者身分,常見於 RESTful API 中,Token 通常是 JWT 或 OAuth2 Token。
step 1 - 安裝 Passport
composer require laravel/passport
php artisan passport:install
step 2 - 在 AuthServiceProvider 中註冊 Passport
use Laravel\Passport\Passport;
class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->registerPolicies();
        Passport::routes();
    }
}
step 3 - 設定 API 認證
在 config/auth.php 檔案中,將 api 驅動設定為 passport:
'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],
step 4 - 建立和配置模型
確保 User 模型實作了 Laravel\Passport\HasApiTokens:
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}
step 5 - 請求 Token
使用 Laravel Passport 提供的 /oauth/token 端點來請求 Token,通常在認證控制器中處理。
auth:api 中間件來保護需要認證的 API 路由:
Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});
php artisan make:policy PostPolicy 建立一個策略 PostPolicy 中定義方法:
public function view(User $user, Post $post)
{
    return $user->id === $post->user_id;
}
AuthServiceProvider 中註冊策略:
protected $policies = [
    Post::class => PostPolicy::class,
];
Post 模型的存取:
if (Gate::allows('view', $post)) {
    // The current user can view the post...
}
使用 Laravel Passport 實現 Token 認證。
step 1 - 安裝與配置 Laravel Passport
使用 composer require laravel/passport 安裝 Passport
發布 Passport 配置文件 php artisan passport:install 產生 Passport 所需的加密金鑰
配置 Passport
註冊 Passport:
在 app/Providers/AuthServiceProvider.php 中註冊 Passport 路由:
use Laravel\Passport\Passport;
class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->registerPolicies();
        Passport::routes();
    }
}
配置 API 認證驅動:
在 config/auth.php 檔案中,將 api 驅動設定為 passport:
'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],
更新 User 模型:
確保 User 模型使用 HasApiTokens trait:
use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}
step 2 - 建立和配置 API 路由
定義 API 路由
在 routes/api.php 檔案中定義受保護的 API 路由:
use App\Http\Controllers\ProfileController;
Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});
Route::middleware('auth:api')->get('/profile', [ProfileController::class, 'show']);
建立控制器
指令 php artisan make:controller ProfileController 建立 ProfileController 處理受保護的路由,並在 app/Http/Controllers/ProfileController.php 中添加方法
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProfileController extends Controller
{
    public function show(Request $request)
    {
        return $request->user();
    }
}
step 3 - 建立 API 認證和請求 Token
建立認證控制器
指令 php artisan make:controller AuthController 建立 AuthController 用於處理使用者認證和取得 Token,在 app/Http/Controllers/AuthController.php 中添加方法:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
class AuthController extends Controller
{
    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');
        if (Auth::attempt($credentials)) {
            $user = Auth::user();
            $token = $user->createToken('Personal Access Token')->plainTextToken;
            return response()->json(['token' => $token]);
        }
        return response()->json(['error' => 'Unauthorized'], 401);
    }
}
定義登入路由
在 routes/api.php 中新增登入路由:
Route::post('/login', [AuthController::class, 'login']);
step 4 - 測試 API 認證
請求 Token
使用 Postman 或其他 API 用戶端發送 POST 請求到 /api/login,提供有效的 email 和 password,成功後,將獲得一個 Token。
存取受保護的 API
使用獲得的 Token 發送 GET 請求到 /api/profile,將 Token 新增至請求的 Authorization 頭部:
Authorization: Bearer {your_token_here}
你應該會收到用戶的個人資料作為回應。
step 5 - 實作 API 授權
創建策略
指令 php artisan make:policy PostPolicy,並且在 app/Policies/PostPolicy.php 中定義授權邏輯:
namespace App\Policies;
use App\Models\User;
use App\Models\Post;
use Illuminate\Auth\Access\HandlesAuthorization;
class PostPolicy
{
    use HandlesAuthorization;
    public function view(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }
}
註冊策略
在 app/Providers/AuthServiceProvider.php 中注册策略:
protected $policies = [
    \App\Models\Post::class => \App\Policies\PostPolicy::class,
];
使用策略
在控制器中使用策略來檢查授權:
use Illuminate\Support\Facades\Gate;
public function show(Post $post)
{
    if (Gate::allows('view', $post)) {
        return response()->json($post);
    }
    return response()->json(['error' => 'Forbidden'], 403);
}